#include<iostream>
#include<vector>
using namespace std;
const int INF = 0x7fffffff;

int idx = 0;

struct TNode{
    int val; // 值的大小
    int lf, rt; // 左右孩子的下标
    int cnt, size; // 节点个数,子树的大小
}tn[10010];

void add(int x, int v) { // 插入节点
    tn[x].size++;
    if(v == tn[x].val) {
        tn[x].cnt++;
        return ;
    }
    if(tn[x].val > v) {
        if(tn[x].lf)    add(tn[x].lf, v); // 递归插入
        else { // 插入新节点
            idx++;
            tn[idx].val = v;
            tn[idx].size = 1;
            tn[idx].cnt = 1;
            tn[x].lf = idx;
        }
    } else {
        if(tn[x].rt)    add(tn[x].rt, v); // 递归插入
        else { // 插入新节点
            idx++;
            tn[idx].val = v;
            tn[idx].size = 1;
            tn[idx].cnt = 1;
            tn[x].rt = idx;
        }
    }
}

int qbyval(int x, int v) {
    if(x == 0)  return 0;
    if(v == tn[x].val)  return tn[tn[x].lf].size;
    if(v < tn[x].val)   return qbyval(tn[x].lf, v);
    return tn[tn[x].lf].size + tn[x].cnt + qbyval(tn[x].rt, v);  
}

int qbyrank(int x, int rk) {
    if(x == 0)  return 0;
    if(tn[tn[x].lf].size < rk) {
        if(tn[tn[x].lf].size + tn[x].cnt >= rk) return tn[x].val;
        else return qbyrank(tn[x].rt, rk - tn[tn[x].lf].size - tn[x].cnt);
    }
    return qbyrank(tn[x].lf, rk);
}

int pre(int x, int v) {
    if(x == 0)  return -INF;
    if(v <= tn[x].val)   return pre(tn[x].lf, v);
    return max(tn[x].val, pre(tn[x].rt, v));
}

int pos(int x, int v) {
    if(x == 0)  return INF;
    if(v >= tn[x].val)   return pos(tn[x].rt, v);
    return min(tn[x].val, pos(tn[x].lf, v));
}

int main() {
    int n;
    cin >> n;
    while(n--) {
        int a, b;
        cin >> a >> b;
        switch(a) {
            case 1: cout << qbyval(1, b) + 1 << endl; break;
            case 2: cout << qbyrank(1, b) << endl; break;
            case 3: cout << pre(1, b) << endl; break;
            case 4: cout << pos(1, b) << endl; break;
            case 5:
                if(idx == 0) {
                    tn[++idx].val = b;
                    tn[idx].size = tn[idx].cnt = 1;
                } else add(1, b);
                break;
            default: cout << "error" << endl; break;
        }
    }
    return 0;
} 